import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from keras import Sequential
from keras.src.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionCV
from tensorflow.python.keras.utils.np_utils import to_categorical
import warnings
from keras.utils import plot_model

# 忽略警告信息

warnings.filterwarnings("ignore")

# 加载seaborn中的iris数据集
iris = sns.load_dataset('iris')
print(iris.head())

# 绘制不同特征对分类的散点图矩阵
sns.pairplot(iris, hue='species')
plt.show()

# 将数据集的前4个特征作为X，最后一个特征作为y
X = iris.values[:, :4]
y = iris.values[:, 4:5]

# 将数据集划分为训练集和测试集
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.1, random_state=1)

# 创建逻辑回归模型
lr = LogisticRegressionCV()

# 使用训练集训练逻辑回归模型
lr.fit(train_X, train_y)

# 打印逻辑回归模型在测试集上的准确率
print(f"Accuracy={lr.score(test_X, test_y)}")

def one_hot_encode_obj_array(arr):
    """
    对目标数组进行热编码

    参数：
    arr：目标数组

    返回值：
    热编码后的目标数组
    """
    uniques, indices = np.unique(arr, return_inverse=True)
    return to_categorical(indices, len(uniques))

# 对训练集和测试集的目标变量进行热编码
train_y_one = one_hot_encode_obj_array(train_y)
test_y_one = one_hot_encode_obj_array(test_y)

# 创建神经网络模型
model=Sequential([
    Dense(10,activation='relu', input_shape=(4,)),
    Dense(10, activation='relu'),
    Dense(3,activation='softmax')
])

# 打印模型的结构和参数信息
print(model.summary())
plot_model(model,show_shapes=True )

# 编译模型，使用Adam优化器和交叉熵损失函数
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 将训练集和测试集的数据类型转换为float32
train_x=np.array(train_X,dtype=np.float32)
test_x=np.array(test_X,dtype=np.float32)

# 在训练集上训练模型，迭代10次，每个batch包含1个样本，显示训练过程的详细信息
model.fit(train_x,train_y_one,epochs=10,batch_size=1,verbose=1)

# 在测试集上评估模型的性能，显示评估结果的详细信息
loss, accuracy = model.evaluate(test_x, test_y_one,verbose=1)

# 打印神经网络模型在测试集上的准确率
print(f"Accuracy={accuracy}")




